package DataStr.ex02;

public class stack01<T> {
    //记录首结点
    private Node head;
    //记录栈中元素个数
    private int size;
    //内部类：节点类
    private class Node{
        //数据域
        public T item;
        //节点域
        public Node next;
        public Node(T item,Node next){
            this.item=item;
            this.next=next;
        }
    }
    //重写栈结构方法
    public stack01(){
        //初始化元素
        this.head=new Node(null,null);
        this.size=0;
    }
    //判断当前栈中元素个数是否为零
    public boolean isEmpty(){
        return size==0;
    }
    //获取栈中元素的个数
    public int N(){
        return size;
    }
    //把t元素压入栈
    public void push(T item){
        //找到首结点指向的第一个结点
        Node OldFirst=head.next;
        //创建新节点
        Node newNode= new Node(item,null);
        //让首节点指向新节点
        head.next=newNode;
        //让新节点指向原来的第一个结点
        newNode.next=OldFirst;
        //元素个数加一
        size++;
    }
    //弹出栈顶元素
    public T pop(){
        //如果栈为空则返回null
        if(isEmpty()){
            return null;
        }
        //找到首节点指向的第一个节点
        Node OldFirst=head.next;
        //将首结点指向第一个节点的下一个节点
        head.next=OldFirst.next;
        //元素个数减一
        size--;
        return OldFirst.item;
    }
}
